package com.cmii.sjw.department.control.jsc.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cmii.sjw.department.control.jsc.model.dto.*;
import com.cmii.sjw.department.control.jsc.model.entity.ApprovalApplication;
import com.cmii.sjw.department.control.jsc.model.entity.ApprovalChangeLog;
import com.cmii.sjw.department.control.jsc.model.entity.CockpitMetricsTree;
import com.cmii.sjw.department.control.jsc.model.vo.ApprovalApplicationVo;
import com.cmii.sjw.department.control.jsc.model.vo.HomePageVo;
import com.cmii.sjw.department.control.jsc.model.vo.StatsSnapshotVo;
import com.cmii.sjw.department.control.jsc.service.CockpitMetricsTreeService;
import com.cmii.sjw.department.control.jsc.util.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.List;

/**
 * 驾驶舱指标树
 * @Author jfh
 * @Date 2025-04-27 周日 9:09
 * @Version 1.0
 */
@Slf4j
@RestController
@CrossOrigin
@RequestMapping("/cockpitMetricsTree")
public class CockpitMetricsTreeController {

    @Autowired
    private CockpitMetricsTreeService cockpitMetricsTreeService;

    /**
     * 加载完整的指标树
     * @return 树形结构数据
     */
    @PostMapping("/tree")
    public Result<List<MetricsTreeNodeDTO>> getMetricsTree() {
        return Result.success(cockpitMetricsTreeService.getMetricsTree());
    }
    /**
     * 默认加载3级指标树
     * @return 树形结构数据
     */
    @PostMapping("/treeWithLevels")
    public Result<List<MetricsTreeNodeDTO>> getTreeWithLevels() {
        return Result.success(cockpitMetricsTreeService.getTreeWithLevels(3));
    }
    /**
     * 加载子节点树
     * @param id 父节点ID
     * @return 子节点列表
     */
    @PostMapping("/nodeLoading")
    public Result<List<MetricsTreeNodeDTO>> getNodeLoading(@RequestBody Long id) {
        log.info("加载子节点树：{}", id);
        List<MetricsTreeNodeDTO> nodes = cockpitMetricsTreeService.getNodeLoading(id);
        return nodes.isEmpty() ? Result.success("暂无子节点", null) : Result.success(nodes);
    }

    /**
     * 分页查询指标列表
     * @param query 查询条件
     * @return 指标分页列表
     */
    @PostMapping("/nodePage")
    public Result<Page<MetricsTreeDTO>> getNodePage(@RequestBody MetricsTreeNodeQueryDTO query) {
        return Result.success(cockpitMetricsTreeService.getNodePage(query));
    }


//    /**
//     * 数据清洗
//     * @return Result
//     */
//    @PostMapping("/dataCleaning")
//    public Result DataCleaning() {
//        cockpitMetricsTreeService.buildIndicatorTree();
//        return Result.success();
//    }

    /**
     * 保存为草稿
     * @param drafts 草稿数据
     * @return Result
     */
    @PostMapping("/saveAsDraft")
    public Result<String> saveAsDraft(@RequestBody List<ApprovalChangeLog> drafts) {
        log.info("保存为草稿：{}", drafts);
        if (drafts.isEmpty()) {
            return Result.error("草稿编辑内容为空");
        }
        cockpitMetricsTreeService.saveAsDraft(drafts);
        return Result.success("保存成功");
    }

    /**
     * 指标历史记录
     * @param id 指标ID
     * @return 历史记录列表
     */
    @PostMapping("/historicalRecords")
    public Result<List<HistoricalRecordsDTO>> historicalRecords(@RequestBody Long id) {
        log.info("历史记录：{}", id);
        return cockpitMetricsTreeService.getHistoricalRecords(id);
    }

    /**
     * 指标报批申请单
     * @param ids 指标ID
     * @return 审批单表单
     */
    @PostMapping("/applyMetrics")
    public Result<MetricsAppFormDTO> metricApply(@RequestBody Long[] ids) {
        log.info("指标审批申请：{}", ids);
        return Result.success(cockpitMetricsTreeService.metricApply(ids));
    }

    /**
     * 指标报批申请单提交
     * @param metricsAppFormDTO 审批单表单
     * @return Result
     */
    @PostMapping("/submitApply")
    public Result<String> submitApply(@RequestBody MetricsAppFormDTO metricsAppFormDTO) {
        log.info("指标审批提交：{}", metricsAppFormDTO);
        return cockpitMetricsTreeService.submitApply(metricsAppFormDTO);
    }

    /**
     * 审批申请历史
     * @param applyHistoryDTO 查询条件
     * @return 审批历史列表
     */
    @PostMapping("/applyHistory")
    public Result<Page<ApprovalApplication>> applyHistory(@RequestBody ApplyHistoryDTO applyHistoryDTO) {
        return cockpitMetricsTreeService.applyHistoryPage(applyHistoryDTO);
    }

    /**
     * 申请历史详情
     * @param id 审批ID
     * @return Result 审批历史详情
     */
    @PostMapping("/applyHistoryDetails")
    public Result<MetricsAppFormDTO> applyHistoryDetails(@RequestBody Long id) {
        return cockpitMetricsTreeService.applyHistoryDetails(id);
    }

    /**
     * 撤销(作废)审批
     * @param auditInfoDTO 审批信息
     * @return Result
     */
    @PostMapping("/revokeInvalid")
    public Result<String> revokeInvalid(@RequestBody AuditInfoDTO auditInfoDTO) {
        log.info("撤销审批：{}", auditInfoDTO);
        if (StringUtils.isBlank(auditInfoDTO.getStatus())) {
            return Result.error("审核状态不能为空！");
        }
        return cockpitMetricsTreeService.revokeInvalid(auditInfoDTO);
    }

    /**
     * 审批分页条件查询查询
     * @param auditInfoDTO
     * @return
     */
    // TODO: 联调完成需要加审核权限 暂未实现
    //@SaCheckRole("data_audit")
    @PostMapping("/findAuditsByPage")
    public Result<Page<ApprovalApplicationVo>> findAuditsByPage(@RequestBody ApplyHistoryDTO auditInfoDTO) {
        return cockpitMetricsTreeService.findAuditsByPage(auditInfoDTO);
    }

    /**
     * 审批详情
     * @param id 审批ID
     * @return Result 审批详情
     */
    // TODO: 联调完成需要加审核权限 暂未实现
    //@SaCheckRole("data_audit")
    @PostMapping("/findAuditsDetails")
    public Result<MetricsAppFormDTO> findAuditsDetails(@RequestBody Long id) {
        return cockpitMetricsTreeService.applyHistoryDetails(id);
    }

    /**
     * 审批
     * @param auditInfoDTO 审批信息 status 0驳回 3通过 4作废
     * @return Result
     */
    // TODO: 联调完成需要加审核权限 暂未实现
    //@SaCheckRole("data_audit")
    @PostMapping("/audits")
    public Result<String> audits(@RequestBody AuditInfoDTO auditInfoDTO) {
        log.info("审批：{}", auditInfoDTO);

        if (StringUtils.isBlank(auditInfoDTO.getStatus())) {
            return Result.error("审核状态不能为空！");
        }
        return cockpitMetricsTreeService.revokeInvalid(auditInfoDTO);
    }

    /**
     * 审批历史数据查询
     * @param query 查询条件
     * @return 指标分页列表
     */
    // TODO: 联调完成需要加审核权限 暂未实现
    // 角色校验：必须具有指定角色才能进入该方法
//    @SaCheckRole("data_audit")
    @PostMapping("/auditsHistory")
    public Result<Page<CockpitMetricsTree>> auditsHistory(@RequestBody MetricsTreeNodeQueryDTO query) {
        return Result.success(cockpitMetricsTreeService.auditsHistory(query));
    }

    /**
     * 首页数据查询
     * @param query 查询条件
     * @return 首页数据
     */
    @PostMapping("/homePage")
    public Result<HomePageVo> homePage(@RequestBody HomePageQueryDTO query) {
        return cockpitMetricsTreeService.homePage(query);
    }

    /**
     * 统计数据查询
     * @return 数据
     */
    @PostMapping("/statsSnapshot")
    public Result<StatsSnapshotVo> statsSnapshot() {
        // 获取当前日期
        LocalDate now = LocalDate.now();

        // 获取本月的开始时间（当月的第一天，时间部分为00:00:00）
        LocalDateTime startOfMonth = now.with(TemporalAdjusters.firstDayOfMonth()).atStartOfDay();

        // 获取本月的结束时间（当月的最后一天，时间部分为23:59:59）
        LocalDateTime endOfMonth = now.with(TemporalAdjusters.lastDayOfMonth()).atTime(23, 59, 59);

        return cockpitMetricsTreeService.StatsSnapshot(startOfMonth,  endOfMonth);
    }


}
